package com.epcs.subGNuevosNegocios.eci.dao.tree;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

import com.epcs.subGNuevosNegocios.eci.conexion.ConexionOracle;
import com.epcs.subGNuevosNegocios.eci.exception.ECISQLException;
import com.epcs.subGNuevosNegocios.eci.to.ControllerTO;
import com.epcs.subGNuevosNegocios.eci.to.EmpleadoTO;
import com.epcs.subGNuevosNegocios.eci.to.HijounidadTO;
import com.epcs.subGNuevosNegocios.eci.to.UsuarioTO;

public class TreeDAOImplement implements TreeDaoInterface {

	public List<HijounidadTO> getHijosUnidad(String idUnidad) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<HijounidadTO> lstUnidad=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETHIJOSUNIDAD(?,?)}");
			stmtProcedure.setString(1, idUnidad);
			stmtProcedure.registerOutParameter(2, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(2);
			
			/*
			 * ar.codi_unidad,
			 *  ar.nomb_unidad,
			 *   ar.codi_unidadpadre,
			 *    ar.codi_jefeunidad
			 */
			lstUnidad = new ArrayList<HijounidadTO>();
			HijounidadTO controllerTO = null;
			while(rs.next())
			{
				controllerTO = new HijounidadTO();
				controllerTO.setIdUnidad(rs.getString(1));
				controllerTO.setNombre(rs.getString(2));
				controllerTO.setIdPadreUnidad(rs.getString(3));
				controllerTO.setIdJefe(rs.getString(4));
				controllerTO.setNumHijos(rs.getString(5));
				lstUnidad.add(controllerTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstUnidad;
	}

	public List<EmpleadoTO> getEmpleadosUnidad(String idUnidad) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOS(?,?)}");
			stmtProcedure.setString(1, idUnidad);
			stmtProcedure.registerOutParameter(2, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(2);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;
	}
	
	@Deprecated
	public List<EmpleadoTO> getEmpleadosUnidadLibres(String idUnidad,Integer idProceso) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOSLIBRES(?,?,?)}");
			stmtProcedure.setString(1, idUnidad);			
			stmtProcedure.setInt(2,idProceso.intValue());
			
			stmtProcedure.registerOutParameter(3, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(3);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;
	}
	
	
	public List<EmpleadoTO> getEmpleadosUnidadNoPS(String idUnidad,
			Integer idProceso, String rutController) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOSNOPS(?,?,?,?)}");
			stmtProcedure.setString(1, idUnidad);
			stmtProcedure.setString(2, rutController);
			stmtProcedure.setInt(3,idProceso.intValue());
			
			
			stmtProcedure.registerOutParameter(4, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(4);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;
	}

	public List<EmpleadoTO> getEmpleadosUnidadNoClientes(String idUnidad,
			Integer idProceso, String rutPS) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOSNOCLIENTES(?,?,?,?)}");
			stmtProcedure.setString(1, idUnidad);			
			stmtProcedure.setInt(2,idProceso.intValue());
			stmtProcedure.setString(3, rutPS);
			
			stmtProcedure.registerOutParameter(4, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(4);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;
	}

	public List<EmpleadoTO> getEmpleadosUnidadNoUsuarios(String idUnidad,
			Integer idProceso) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOSNOUSUARIOS(?,?,?)}");
			stmtProcedure.setString(1, idUnidad);			
			stmtProcedure.setInt(2,idProceso.intValue());
			
			stmtProcedure.registerOutParameter(3, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(3);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;

	}
	
	
	public List<EmpleadoTO> getEmpleadosNoControllers(String idUnidad,
			Integer idProceso) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLOYENOCONTROLL(?,?,?)}");
			stmtProcedure.setString(1, idUnidad);			
			stmtProcedure.setInt(2,idProceso.intValue());
			
			stmtProcedure.registerOutParameter(3, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(3);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;

	}
	
	
	
	//Buscador
	public List<HijounidadTO> getUnidadesBuscador(String nombreUnidad)
	{
		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<HijounidadTO> lstUnidades=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETUNIDADBYNOMBRE(?,?)}");
			stmtProcedure.setString(1, nombreUnidad);
			stmtProcedure.registerOutParameter(2, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(2);
			
			/*
			 * ar.codi_unidad,
			 *  ar.nomb_unidad,
			 *   ar.codi_unidadpadre,
			 *    ar.codi_jefeunidad
			 */
			lstUnidades = new ArrayList<HijounidadTO>();
			HijounidadTO unidad = null;
			while(rs.next())
			{
				unidad = new HijounidadTO();
				unidad.setIdUnidad(rs.getString(1));
				unidad.setNombre(rs.getString(2));
				unidad.setIdPadreUnidad(rs.getString(3));
				unidad.setIdJefe(rs.getString(4));
				unidad.setNumHijos(rs.getString(5));
				lstUnidades.add(unidad);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstUnidades;
	}
	
	public List<HijounidadTO> getUnidadesBuscadorPorPadre(String codiUnidad, String nombreUnidad, String rut)
	{
		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<HijounidadTO> lstUnidades=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETUNIDADBYNOMYPADRE(?,?,?,?)}");
			stmtProcedure.setString(1, codiUnidad);
			stmtProcedure.setString(2, nombreUnidad);
			stmtProcedure.setString(3, rut);
			stmtProcedure.registerOutParameter(4, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(4);
			
			/*
			 * ar.codi_unidad,
			 *  ar.nomb_unidad,
			 *   ar.codi_unidadpadre,
			 *    ar.codi_jefeunidad
			 */
			lstUnidades = new ArrayList<HijounidadTO>();
			HijounidadTO unidad = null;
			while(rs.next())
			{
				unidad = new HijounidadTO();
				unidad.setIdUnidad(rs.getString(1));
				unidad.setNombre(rs.getString(2));
				unidad.setIdPadreUnidad(rs.getString(3));
				unidad.setIdJefe(rs.getString(4));
				unidad.setNumHijos(rs.getString(5));
				lstUnidades.add(unidad);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstUnidades;
	}
	
	public List<EmpleadoTO> getEmpleadosBuscador(String strNombreEmpleado, Integer idProceso, String rutPS)
	{
		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleados=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOSBYNOMBRE(?,?,?,?)}");
			stmtProcedure.setString(1, strNombreEmpleado);
			stmtProcedure.setInt(2, idProceso);
			stmtProcedure.setString(3, rutPS);
			stmtProcedure.registerOutParameter(4, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(4);
			
			/*
			 	emp.codi_empleado,
   				emp.nrut_empleado, emp.nomb_usuario, 
			   	emp.nomb_empleado,emp.codi_area,
			   	emp.mail_usuario,
			   	(case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
			   	arb.nomb_unidad
			 */
			lstEmpleados = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(rs.getString(5));
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleados.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleados;
	}
	
	public List<EmpleadoTO> getEmpleadosBuscadorRaizN1(String nombEmpleado, Integer idProceso)
	{
		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleados=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOBYNOMBNOCTR(?,?,?)}");
			stmtProcedure.setString(1, nombEmpleado);
			stmtProcedure.setInt(2, idProceso);
			stmtProcedure.registerOutParameter(3, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(3);
			
			/*
			 	emp.codi_empleado,
   				emp.nrut_empleado, emp.nomb_usuario, 
			   	emp.nomb_empleado,emp.codi_area,
			   	emp.mail_usuario,
			   	(case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
			   	arb.nomb_unidad
			 */
			lstEmpleados = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(rs.getString(5));
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleados.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleados;
	}
	
	public List<EmpleadoTO> getEmpleadosBuscadorRaizPadre(String codiUnidad, String rutController, String nombEmpleado, Integer idProceso)
	{
		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleados=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLEADOSBYNOMBNOPS(?,?,?,?,?)}");
			stmtProcedure.setString(1, codiUnidad);
			stmtProcedure.setString(2, rutController);
			stmtProcedure.setString(3, nombEmpleado);
			stmtProcedure.setInt(4, idProceso);
			stmtProcedure.registerOutParameter(5, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(5);
			
			/*
			 	emp.codi_empleado,
   				emp.nrut_empleado, emp.nomb_usuario, 
			   	emp.nomb_empleado,emp.codi_area,
			   	emp.mail_usuario,
			   	(case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
			   	arb.nomb_unidad
			 */
			lstEmpleados = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(rs.getString(5));
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleados.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleados;
}

	public List<EmpleadoTO> getEmpleadosUnidadCompleta(String idUnidad,
			Integer idProceso, String rutUsuario) {

		Connection connection = ConexionOracle.getConnection();
		CallableStatement stmtProcedure = null;
		ResultSet rs=null;
		List<EmpleadoTO> lstEmpleado=null;
		try{
			stmtProcedure = connection.prepareCall("{call PRO_ECI_GETEMPLENOCLIEXT(?,?,?,?)}");
			stmtProcedure.setString(1, idUnidad);			
			stmtProcedure.setInt(2,idProceso.intValue());
			stmtProcedure.setString(3, rutUsuario);
			
			stmtProcedure.registerOutParameter(4, OracleTypes.CURSOR);
			stmtProcedure.execute();
			rs = ((OracleCallableStatement)stmtProcedure).getCursor(4);
			
			/*
			 emp.codi_empleado,
    emp.nrut_empleado, emp.nomb_usuario, 
    emp.nomb_empleado,emp.codi_area,
    emp.mail_usuario,
    (case when emp.codi_empleado = arb.codi_jefeunidad then 'jefe' else 'empleado' end) as tipo_empleado, 
    arb.nomb_unidad
			 */
			lstEmpleado = new ArrayList<EmpleadoTO>();
			EmpleadoTO empleadoTO = null;
			while(rs.next())
			{
				int colid =0;
				empleadoTO = new EmpleadoTO();
				empleadoTO.setIdEmpleado(rs.getString(++colid));
				empleadoTO.setRut(rs.getString(++colid));
				empleadoTO.setNombreUsuario(rs.getString(++colid));
				empleadoTO.setNombreCompleto(rs.getString(++colid).replace("'", " "));
				empleadoTO.setIdArea(rs.getString(++colid));
				empleadoTO.setMail(rs.getString(++colid));
				empleadoTO.setIdTipo(rs.getString(++colid));
				empleadoTO.setNombreArea(rs.getString(++colid));
				empleadoTO.setCodiArea(idUnidad);
				empleadoTO.setAsignadoArea(rs.getString(++colid));
				lstEmpleado.add(empleadoTO);
			}
		}catch(SQLException e)
		{
			throw new ECISQLException(e);
		}
		finally
		{
			if(stmtProcedure!=null)
			{
				try{
					stmtProcedure.close();
				}
				catch(SQLException e)
				{
					//System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
			if(connection!=null)
			{
				try{
					connection.close();
				}catch (SQLException e) {
					////System.out.print("No se pudo cerrar el statement :"+ e);
				}
			}
		}
		return lstEmpleado;

	}

}
